package infixupn;

public class UPN{
  /**Berechnet einen UPN-Term.
   * @param uqu der UPN-Term als Sequenz von Zahlen und Operatoren.
   * @return den obersten Stackeintrag. Wenn uqu kein korrekter UPN-Term ist,
   * wird die letzte Zahl zurück gegeben.
   */
  public static double upn(Queue uqu){
    double a, b;
    Stack st=new Stack();
    while(!uqu.empty()){
      if(uqu.numberNext()) st.push(uqu.takeDouble());
      else
        switch(uqu.takeString()){
          case "+":
            a=st.pullDouble();
            b=st.pullDouble();
            st.push(a+b);
            break;
          case "*":
            a=st.pullDouble();
            b=st.pullDouble();
            st.push(a*b);
            break;
        }
    }
    return st.pullDouble();
  }

  public static void main(String[] args){
    // Aufruf: java UPN "2 3 + 4 *"
    // Stelle Eingabe als Queue bereit.
    Queue qu=new Queue();
    for(String s: args[0].split(" "))//trenne bei Leerzeichen
      try{
        double zahl=Double.parseDouble(s);
        qu.put(zahl);
      } catch(Exception ex){
        qu.put(s);
      }
    System.out.println(upn(qu));
  }
}
